contents
JSON은 사람이 읽을 수 있는 경량의 텍스트 기반 데이터 교환 형식인 반면, BSON은 JSON과 유사한 도큐먼트를 위한 바이너리 인코딩 직렬화 형식입니다. 간단히 말해, BSON은 저장 및 속도 효율성을 위해 설계된, 기계가 읽기 빠른 JSON 버전입니다.
각각을 자세히 분석해 보겠습니다.
JSON (JavaScript Object Notation) 📄
JSON은 사람이 읽고 쓰기 쉬우며, 기계가 파싱하고 생성하기 쉬운 텍스트 기반 데이터 형식입니다. 자바스크립트에서 파생되었지만 현재는 언어에 독립적이며, 거의 모든 프로그래밍 언어에서 파서를 사용할 수 있습니다.
데이터 타입
JSON은 여섯 가지 기본 데이터 타입을 지원합니다.
- 문자열 (String): 큰따옴표 안의 문자 시퀀스 (예:
"Hello, World!"). - 숫자 (Number): 정수 또는 부동 소수점 수 (예:
42,3.14). - 불리언 (Boolean):
true또는false. - 배열 (Array): 대괄호 안의 순서 있는 값의 목록 (예:
["사과", "바나나", "체리"]). - 객체 (Object): 중괄호 안의 순서 없는 키/값 쌍의 모음 (예:
{"이름": "홍길동", "나이": 30}). null: 빈 값을 나타냅니다.
예시
다음은 사용자를 나타내는 일반적인 JSON 객체입니다.
{
"userId": "u123",
"username": "johndoe",
"isActive": true,
"lastLogin": "2025-10-03T05:20:00Z",
"tags": ["사용자", "기여자"],
"profile": {
"followers": 150,
"following": 75
}
}
JSON의 장점
- 사람이 읽을 수 있음: 텍스트 기반이어서 읽고 디버깅하기 쉽습니다.
- 언어 독립적: 모든 주요 프로그래밍 언어에서 지원됩니다.
- 광범위한 사용: 웹 API 및 설정 파일의 사실상 표준입니다.
JSON의 단점
- 제한된 데이터 타입: 날짜(주로 문자열로 저장됨)나 바이너리 데이터(주로 base64로 인코딩됨)와 같은 더 복잡한 타입을 기본적으로 지원하지 않습니다.
- 파싱 오버헤드: 텍스트 형식이므로 파싱이 필요하며, 이는 바이너리 형식을 처리하는 것보다 느리고 CPU를 더 많이 사용할 수 있습니다.
- 스캔 불가: 특정 키의 값을 찾으려면 종종 전체 객체를 파싱해야 합니다.
BSON (바이너리 JSON) ⚙️
BSON은 JSON과 유사한 도큐먼트를 위한 바이너리 인코딩 직렬화 형식입니다. 이는 MongoDB를 위해 만들어졌으며, 데이터베이스 저장 및 네트워크 전송에서 JSON보다 더 효율적이고 풍부한 기능을 제공하도록 설계되었습니다.
BSON이 존재하는 이유 (해결하는 문제)
BSON은 JSON의 단점을 해결하기 위해 설계되었습니다.
- 탐색 속도 (스캔 가능성): 이것이 핵심 장점입니다. BSON은 데이터 자체에 요소와 도큐먼트의 길이 정보를 포함합니다. 이를 통해 BSON 파서는 필요 없는 필드를 파싱하지 않고 건너뛸 수 있습니다. JSON 객체의 경우, 끝 부분에 있는 필드를 찾으려면 전체 텍스트를 파싱해야 하지만, BSON 객체는 해당 필드로 직접 이동할 수 있습니다.
- 효율성: 길이 및 타입 정보 오버헤드 때문에 항상 JSON보다 크기가 작은 것은 아니지만, BSON은 기계가 인코딩(직렬화)하고 디코딩(역직렬화)하기에 매우 빠르도록 설계되었습니다.
- 더 많은 데이터 타입: BSON은 JSON에서 사용할 수 없는 유용한 추가 타입을 통해 JSON 데이터 타입을 확장합니다. 여기에는 다음이 포함됩니다.
- 날짜 (Date): 유닉스 시간(Unix epoch) 이후의 밀리초를 나타내는 64비트 정수.
- 바이너리 데이터 (Binary Data): 이미지나 다른 파일 데이터와 같은 바이트 배열을 저장.
- 특정 너비의 정수:
Int32,Int64. - ObjectId: MongoDB의 기본이 되는 12바이트 고유 ID.
- 정규 표현식, 타임스탬프 등.
BSON 구조
BSON은 직접 손으로 작성하지 않습니다. 바이너리 형식이기 때문입니다. 위 JSON 예제는 BSON에서 바이트 시퀀스로 표현되며, 각 필드는 타입, 이름, 값으로 접두사가 붙습니다. 전체 객체 또한 총 길이를 바이트 단위로 나타내는 접두사를 가집니다.
주요 차이점 요약 ⚖️
| 특징 | JSON (JavaScript Object Notation) | BSON (바이너리 JSON) |
|---|---|---|
| 형식 | 텍스트 기반 | 바이너리 기반 |
| 가독성 | 사람이 읽을 수 있음 | 기계가 읽을 수 있음 |
| 파싱 속도 | 느림 (텍스트 파싱 필요) | 빠름 (빠른 인코딩/디코딩을 위해 설계됨) |
| 탐색 | 요소를 찾기 위해 전체 구조를 파싱해야 함. | 스캔 가능. 불필요한 필드를 건너뛸 수 있음. |
| 데이터 타입 | 제한적 (문자열, 숫자, 불리언, 배열, 객체, null) | 확장됨 (날짜, 바이너리 데이터, ObjectId 등 포함) |
| 크기 | 작은 도큐먼트의 경우 종종 더 작음. | 타입/길이 오버헤드로 더 클 수 있지만 효율적임. |
| 주요 사용처 | 웹 API, 설정 파일. | MongoDB 데이터 저장 및 네트워크 프로토콜. |
언제 무엇을 사용해야 할까?
-
JSON을 사용해야 할 때:
- 사람이 데이터를 읽거나 편집해야 할 때 (예: 설정 파일).
- 클라이언트-서버 통신을 위한 웹 API를 구축할 때. 이는 보편적인 표준입니다.
- 약간의 성능 향상보다 단순성과 가독성이 더 중요할 때.
-
BSON을 사용해야 할 때:
- MongoDB와 작업할 때. 이것이 네이티브 형식이기 때문입니다.
- 바이너리 데이터나 특정 날짜 타입과 같이 JSON에서 지원하지 않는 데이터 타입을 저장해야 할 때.
- 특히 큰 도큐먼트를 완전히 파싱하지 않고 빠르게 스캔하고 탐색하는 능력이 중요한 요구사항일 때.
references